Fill in string, length and is_modifier for key events. Map some more keys
authorRichard Hult <richard@imendio.com>
Mon, 17 Jul 2006 18:39:43 +0000 (18:39 +0000)
committerRichard Hult <rhult@src.gnome.org>
Mon, 17 Jul 2006 18:39:43 +0000 (18:39 +0000)
2006-07-17  Richard Hult  <richard@imendio.com>

* gdk/quartz/gdkevents-quartz.c: (create_key_event):
* gdk/quartz/gdkkeys-quartz.c: (_gdk_quartz_key_event_type),
(_gdk_quartz_key_is_modifier):
* gdk/quartz/gdkprivate-quartz.h: Fill in string, length and
is_modifier for key events. Map some more keys into gdk keyvals.

ChangeLog
ChangeLog.pre-2-10
gdk/quartz/gdkevents-quartz.c
gdk/quartz/gdkkeys-quartz.c
gdk/quartz/gdkprivate-quartz.h

index e20795822da3055aa12d0efabd64dbcbfad5d166..77fef5ffecc54a6532d2e667be5208e8b74c1481 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2006-07-17  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkevents-quartz.c: (create_key_event):
+       * gdk/quartz/gdkkeys-quartz.c: (_gdk_quartz_key_event_type),
+       (_gdk_quartz_key_is_modifier):
+       * gdk/quartz/gdkprivate-quartz.h: Fill in string, length and
+       is_modifier for key events. Map some more keys into gdk keyvals.
+
 2006-07-17  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtknotebook.c (gtk_notebook_stop_reorder): Don't undo
index e20795822da3055aa12d0efabd64dbcbfad5d166..77fef5ffecc54a6532d2e667be5208e8b74c1481 100644 (file)
@@ -1,3 +1,11 @@
+2006-07-17  Richard Hult  <richard@imendio.com>
+
+       * gdk/quartz/gdkevents-quartz.c: (create_key_event):
+       * gdk/quartz/gdkkeys-quartz.c: (_gdk_quartz_key_event_type),
+       (_gdk_quartz_key_is_modifier):
+       * gdk/quartz/gdkprivate-quartz.h: Fill in string, length and
+       is_modifier for key events. Map some more keys into gdk keyvals.
+
 2006-07-17  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtknotebook.c (gtk_notebook_stop_reorder): Don't undo
index 859d757b1b1b47fee685c184977bf77c410cc90c..409264a230eb2c9be1cedcd1c258200ca881e636 100644 (file)
 #include <pthread.h>
 #include <unistd.h>
 
+#include <Carbon/Carbon.h>
+
 #include "gdkscreen.h"
+#include "gdkkeysyms.h"
+
 #include "gdkprivate-quartz.h"
 
 static GPollFD event_poll_fd;
@@ -1340,6 +1344,8 @@ static GdkEvent *
 create_key_event (GdkWindow *window, NSEvent *nsevent, GdkEventType type)
 {
   GdkEvent *event;
+  gchar buf[7];
+  gunichar c = 0;
 
   event = gdk_event_new (type);
   event->key.window = window;
@@ -1347,6 +1353,8 @@ create_key_event (GdkWindow *window, NSEvent *nsevent, GdkEventType type)
   event->key.state = get_keyboard_modifiers_from_nsevent (nsevent);
   event->key.hardware_keycode = [nsevent keyCode];
   event->key.group = ([nsevent modifierFlags] & NSAlternateKeyMask) ? 1 : 0;
+
+  event->key.keyval = GDK_VoidSymbol;
   
   gdk_keymap_translate_keyboard_state (NULL,
                                       event->key.hardware_keycode,
@@ -1355,6 +1363,46 @@ create_key_event (GdkWindow *window, NSEvent *nsevent, GdkEventType type)
                                       &event->key.keyval,
                                       NULL, NULL, NULL);
 
+  event->key.is_modifier = _gdk_quartz_key_is_modifier (event->key.hardware_keycode);
+
+  event->key.string = NULL;
+
+  /* Fill in ->string since apps depend on it, taken from the x11 backend. */
+  if (event->key.keyval != GDK_VoidSymbol)
+    c = gdk_keyval_to_unicode (event->key.keyval);
+
+    if (c)
+    {
+      gsize bytes_written;
+      gint len;
+
+      len = g_unichar_to_utf8 (c, buf);
+      buf[len] = '\0';
+      
+      event->key.string = g_locale_from_utf8 (buf, len,
+                                             NULL, &bytes_written,
+                                             NULL);
+      if (event->key.string)
+       event->key.length = bytes_written;
+    }
+  else if (event->key.keyval == GDK_Escape)
+    {
+      event->key.length = 1;
+      event->key.string = g_strdup ("\033");
+    }
+  else if (event->key.keyval == GDK_Return ||
+         event->key.keyval == GDK_KP_Enter)
+    {
+      event->key.length = 1;
+      event->key.string = g_strdup ("\r");
+    }
+
+  if (!event->key.string)
+    {
+      event->key.length = 0;
+      event->key.string = g_strdup ("");
+    }
+
   GDK_NOTE(EVENTS,
     g_message ("key %s:\t\twindow: %p  key: %12s  %d",
          type == GDK_KEY_PRESS ? "press" : "release",
index 1ea173671e1cc09ab56a468e6079e6dd0e3d76e0..bee7cc8113973630f18819641648376c5925ed8d 100644 (file)
@@ -160,6 +160,8 @@ const static struct {
   guint keyval;
 } special_ucs_table [] = {
   { 0x0001, GDK_Home },
+  { 0x0003, GDK_Return },
+  { 0x0004, GDK_End },
   { 0x0008, GDK_BackSpace },
   { 0x0009, GDK_Tab },
   { 0x000b, GDK_Page_Up },
@@ -169,7 +171,8 @@ const static struct {
   { 0x001c, GDK_Left },
   { 0x001d, GDK_Right },
   { 0x001e, GDK_Up },
-  { 0x001f, GDK_Down }
+  { 0x001f, GDK_Down },
+  { 0x007f, GDK_Delete }
 };
 
 static void
@@ -582,7 +585,8 @@ gdk_keymap_translate_keyboard_state (GdkKeymap       *keymap,
 /* What sort of key event is this? Returns one of
  * GDK_KEY_PRESS, GDK_KEY_RELEASE, GDK_NOTHING (should be ignored)
  */
-GdkEventType _gdk_quartz_key_event_type (NSEvent *event)
+GdkEventType
+_gdk_quartz_key_event_type (NSEvent *event)
 {
   unsigned short keycode;
   unsigned int flags;
@@ -590,10 +594,14 @@ GdkEventType _gdk_quartz_key_event_type (NSEvent *event)
   
   switch ([event type])
     {
-      case NSKeyDown: return GDK_KEY_PRESS;
-      case NSKeyUp:   return GDK_KEY_RELEASE;
-      case NSFlagsChanged: break; /* Continue... */
-      default: g_assert_not_reached ();
+    case NSKeyDown:
+      return GDK_KEY_PRESS;
+    case NSKeyUp:
+      return GDK_KEY_RELEASE;
+    case NSFlagsChanged:
+      break;
+    default:
+      g_assert_not_reached ();
     }
   
   /* For flags-changed events, we have to find the special key that caused the
@@ -604,15 +612,32 @@ GdkEventType _gdk_quartz_key_event_type (NSEvent *event)
   for (i = 0; i < G_N_ELEMENTS (known_keys); i++)
     {
       if (known_keys[i].keycode == keycode)
-          {
-                if (flags & known_keys[i].modmask)
-                  return GDK_KEY_PRESS;
-                else
-                  return GDK_KEY_RELEASE;
-          }
+       {
+         if (flags & known_keys[i].modmask)
+           return GDK_KEY_PRESS;
+         else
+           return GDK_KEY_RELEASE;
        }
+    }
   
   /* Some keypresses (eg: Expose' activations) seem to trigger flags-changed
    * events for no good reason. Ignore them! */
   return GDK_NOTHING;
 }
+
+gboolean
+_gdk_quartz_key_is_modifier (guint keycode)
+{
+  gint i;
+  
+  for (i = 0; i < G_N_ELEMENTS (known_keys); i++)
+    {
+      if (known_keys[i].modmask == 0)
+       break;
+
+      if (known_keys[i].keycode == keycode)
+       return TRUE;
+    }
+
+  return FALSE;
+}
index 960844d3b5b8f7277de0892c09f901d5835388e2..101fe80fedb0153ac003c1fb8285584ed406ec25 100644 (file)
@@ -96,6 +96,7 @@ GdkGC *_gdk_quartz_gc_new (GdkDrawable      *drawable,
 void _gdk_windowing_window_init (void);
 void _gdk_events_init           (void);
 void _gdk_visual_init           (void);
+void _gdk_input_init            (void);
 
 void _gdk_quartz_set_context_fill_color_from_pixel (CGContextRef context, GdkColormap *colormap, guint32 pixel);
 void _gdk_quartz_set_context_stroke_color_from_pixel (CGContextRef context, GdkColormap *colormap, guint32 pixel);
@@ -122,7 +123,8 @@ GdkImage *_gdk_quartz_copy_to_image (GdkDrawable *drawable,
 
 void _gdk_quartz_send_map_events (GdkWindow *window);
 
-GdkEventType _gdk_quartz_flags_changed_is_press (NSEvent *event);
+GdkEventType _gdk_quartz_key_event_type  (NSEvent   *event);
+gboolean     _gdk_quartz_key_is_modifier (guint      keycode);
 
 extern GdkWindow *_gdk_quartz_keyboard_grab_window;
 extern GdkWindow *_gdk_quartz_pointer_grab_window;